package com.njupt.simulation.utils;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * 用于生成在指定区域内的随机点分布
 */
public class Randomly {

    // 地球半径，单位为米
    private static final double EARTH_RADIUS = 6378137;

    /**
     * 生成随机点分布
     *
     * @param centerLat 圆心纬度
     * @param centerLon 圆心经度
     * @param radiusKm 圆形区域的半径，单位为公里
     * @param density 区域内的点数密度，单位为点数/平方公里
     * @return 包含所有随机点的列表，每个点由纬度和经度组成
     */
    public static List<double[]> generateRandomPoints(double centerLat, double centerLon, double radiusKm, double density) {
        double radius = radiusKm * 1000; // 转换半径单位为米
        double area = Math.PI * Math.pow(radiusKm, 2); // 圆形区域面积，单位为平方公里
        int numPoints = (int) (area * density); // 计算点数

        List<double[]> points = new ArrayList<>();
        Random random = new Random();

        for (int i = 0; i < numPoints; i++) {
            // 随机生成距离和角度
            double distance = radius * Math.sqrt(random.nextDouble());
            double angle = random.nextDouble() * 2 * Math.PI;

            // 计算随机点的纬度和经度
            double latitude = calculateLatitude(centerLat, distance, angle);
            double longitude = calculateLongitude(centerLat, centerLon, distance, angle);

            points.add(new double[]{longitude,latitude,0.0});
        }

        return points;
    }

    /**
     * 计算随机点的纬度
     *
     * @param centerLat 圆心纬度
     * @param distance 随机点到圆心的距离，单位为米
     * @param angle 随机点相对于圆心的角度，单位为弧度
     * @return 随机点的纬度
     */
    private static double calculateLatitude(double centerLat, double distance, double angle) {
        double distanceLat = distance * Math.cos(angle) / EARTH_RADIUS;
        return centerLat + Math.toDegrees(distanceLat);
    }

    /**
     * 计算随机点的经度
     *
     * @param centerLat 圆心纬度
     * @param centerLon 圆心经度
     * @param distance 随机点到圆心的距离，单位为米
     * @param angle 随机点相对于圆心的角度，单位为弧度
     * @return 随机点的经度
     */
    private static double calculateLongitude(double centerLat, double centerLon, double distance, double angle) {
        double distanceLon = distance * Math.sin(angle) / (EARTH_RADIUS * Math.cos(Math.toRadians(centerLat)));
        return centerLon + Math.toDegrees(distanceLon);
    }

    /**
     * 主函数，用于演示生成随机点分布的功能
     */
    public static void main(String[] args) {
        double centerLat = 40.0; // 圆心纬度
        double centerLon = -74.0; // 圆心经度
        double radiusKm = 50; // 半径，单位为公里
        double density = 0.71; // 密度，单位为点数/平方公里

        List<double[]> points = generateRandomPoints(centerLat, centerLon, radiusKm, density);

        for (int i = 0; i < points.size(); i++) {
            System.out.printf("No%d,Latitude = %.6f, Longitude = %.6f%n", i+1, points.get(i)[0], points.get(i)[1]);
        }
    }
}
